# @Time : 2020/6/25 9:42
# @Author : Fioman 
# @Phone : 13149920693
"""
利用.append和.pop方法,我们可以把列表当做栈或者队列来用.(比如,把.append和pop(0)合起来使用,就能模拟栈的"先进先出"的特点),但是删除列表的第一个元素
(抑或是在第一个元素之前添加一个元素)之类的操作都是很耗时的,因为这些操作会牵扯到移动列表里的所有的元素.
collections.deque类(双向队列)是一个线程安全,可以快速从两端添加或者删除元素的数据类型.而且如果想要有一种数据类型来存放"最近用到的几个元素",deque也是一个
很好的选择.这是因为在新建一个双向队列的时候,你可以指定这个队列的大小,如果这个队列满员了,还可以从反向端删除过期的元素,然后再尾端添加新的元素.
"""
from collections import deque

# maxlen是一个可选参数,代表这个队列可以容纳的元素的数量,而且一旦设定,这个属性就不能修改了.
dq = deque(range(10), maxlen=10)
print("dq = {}".format(dq))
# 队列的旋转操作接受一个参数n,当n>0的时候,队列的最右边的n个元素会被移动到队列的左边.当n<0的时候,最左边的n个元素会被移动到右边
dq.rotate(3)
print("右边的移动到最前面 = {}".format(dq))
dq.rotate(-4)
print("左边的移动到最后面 = {}".format(dq))

# 当对一个已经是满的队列做尾部添加操作的时候,它头部的元素会被删除掉.当在头部添加的时候,尾部会被删除掉
dq.appendleft(100)
print("append_left = {}".format(dq))

# 在右边添加,然后会看到首部的元素被移除掉了
dq.append(200)
print("append_right = {}".format(dq))

# extend
dq.extend([6, 6, 6, 6])
print("dq = {}".format(dq))

dq.extendleft([7, 7, 7, 7])
print("dq = {}".format(dq))
